package com.far.dao;

import java.io.IOException;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.MissingResourceException;

import org.apache.log4j.Logger;

import oracle.jdbc.OracleTypes;
import utiles.AppProperties;
import utiles.ConexionPool;
import utiles.utilitarios;

import com.far.dto.BonificacionBoletaDTO;
import com.far.dto.FechaVencimientoDTO;
import com.far.vo.FechVencimientoVO;



public class FarFechVencimientoDAO {
	private static Logger log = Logger.getLogger(FarDocumentoPacDAO.class);
	String pkgVar = (AppProperties.getProperty("aplicacion", "PACKAGE"));
	String horaActual = utilitarios.getFechaHoraActual();
	
	public  List<BonificacionBoletaDTO> getAllMedicamento() throws SQLException, IOException{

		Connection conn = ConexionPool.getConnectionPool();	

		ArrayList<BonificacionBoletaDTO> listRetorno = new ArrayList<BonificacionBoletaDTO>();
		try {
			String query = "{ call "+pkgVar+".PKG_FAR_COMBO.getAllMedicamento(?) }"; 	       
			CallableStatement  stmt = conn.prepareCall(query);
			stmt.registerOutParameter(1, OracleTypes.CURSOR);
			stmt.execute();
			ResultSet rs = (ResultSet)stmt.getObject(1);
			while (rs.next()) {
				BonificacionBoletaDTO medicamento = new BonificacionBoletaDTO();
				medicamento.setKinf(rs.getString(1));
				medicamento.setDescripcion(rs.getString(2));
				
				listRetorno.add(medicamento);				
			}
			rs.close();
			stmt.close();
		} catch (SQLException ex) {  
			log.error("Error PKG_FAR_COMBO.getAllMedicamento SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());
		} finally {			
			conn.close();
			conn = null;
		}
		return listRetorno;
	}
	
	
		
	public  List<FechaVencimientoDTO>  getFechaVencimiento(String idsede, String kinf, String fini, String ffin ) throws SQLException, IOException{

		Connection conn = ConexionPool.getConnectionPool();	

		ArrayList<FechaVencimientoDTO> listRetorno = new ArrayList<FechaVencimientoDTO>();
		try {
			String query = "{ call "+pkgVar+".PKG_FAR_FECHA_VENCIMIENTO.getFechaVencimiento(?,?,?,?,?) }"; 	
			CallableStatement  stmt = conn.prepareCall(query);
			stmt.setString(1, idsede);
			stmt.setString(2, kinf);
			stmt.setString(3, fini);
			stmt.setString(4, ffin);
			stmt.registerOutParameter(5, OracleTypes.CURSOR);
			stmt.execute();
			ResultSet rs = (ResultSet)stmt.getObject(5);
			
			
			while (rs.next()) {
				FechaVencimientoDTO fecvenci = new FechaVencimientoDTO();
				fecvenci.setKinf(rs.getString(1));
				fecvenci.setPres(rs.getString(2));
				fecvenci.setDinf(rs.getString(3));
				fecvenci.setFven(rs.getString(4));
				fecvenci.setCantidad(rs.getString(5));
				fecvenci.setObservacion(rs.getString(6));
				fecvenci.setSerie(rs.getString(7));
				fecvenci.setDsuc(rs.getString(8));
				fecvenci.setKsuc(rs.getString(9));
				fecvenci.setEdita(rs.getString(10));
				listRetorno.add(fecvenci);		
			}
			rs.close();
			stmt.close();
		} catch (SQLException ex) {  
			log.error("Error PKG_FAR_FECHA_VENCIMIENTO.getFechaVencimiento SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());
		} finally {			
			conn.close();
			conn = null;
		}
		return listRetorno;
	}
	
	
	
	public  List<FechaVencimientoDTO> getStockByBodega(String idsede) throws SQLException, IOException{

		Connection conn = ConexionPool.getConnectionPool();	

		ArrayList<FechaVencimientoDTO> listRetorno = new ArrayList<FechaVencimientoDTO>();
		try {
			String query = "{ call "+pkgVar+".PKG_FAR_FECHA_VENCIMIENTO.getStockByBodega(?,?) }"; 	       
			CallableStatement  stmt = conn.prepareCall(query);
			stmt.setString(1, idsede);
			stmt.registerOutParameter(2, OracleTypes.CURSOR);
			stmt.execute();
			ResultSet rs = (ResultSet)stmt.getObject(2);
			while (rs.next()) {
				FechaVencimientoDTO vstock = new FechaVencimientoDTO();
				vstock.setDinf(rs.getString(1));
				vstock.setKbod(rs.getString(2));
				vstock.setKinf(rs.getString(3));
				vstock.setPres(rs.getString(4));
				vstock.setSaldo(rs.getString(5));
				vstock.setStock(rs.getString(6));

				listRetorno.add(vstock);				
			}
			rs.close();
			stmt.close();
		} catch (SQLException ex) {  
			log.error("Error PKG_FAR_FECHA_VENCIMIENTO.getStockByBodega SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());
		} finally {			
			conn.close();
			conn = null;
		}
		return listRetorno;
	}
	
		
	public  List<FechVencimientoVO> setActualizaFechaVenc(FechVencimientoVO documentofechvenVo) throws SQLException, IOException{

		Connection conn = ConexionPool.getConnectionPool();	

		List<FechVencimientoVO> listRetorno = new ArrayList<FechVencimientoVO>();
		try {
			String query = "{ call "+pkgVar+".PKG_FAR_FECHA_VENCIMIENTO.setGrabaFechaVenc(?,?,?,?,?,?,?,?,?,?) }";
			//System.out.println("Precio:"+documentoDetVo.getPrecioListaNeto()+"fin");
			CallableStatement  stmt = conn.prepareCall(query);
			stmt.setString(1, documentofechvenVo.getDsuc());
			stmt.setString(2, documentofechvenVo.getKsuc());
			stmt.setString(3, documentofechvenVo.getPres());
			stmt.setString(4, documentofechvenVo.getKinf());		
			stmt.setString(5, documentofechvenVo.getDinf());
			stmt.setString(6, documentofechvenVo.getFven());
			stmt.setString(7, documentofechvenVo.getSerie());
			stmt.setString(8, documentofechvenVo.getCantidad());
			stmt.setString(9, documentofechvenVo.getObservacion());
			stmt.registerOutParameter(10, OracleTypes.CURSOR);
			stmt.execute();
			ResultSet rs = (ResultSet)stmt.getObject(10);
			
			while (rs.next()) {	
				FechVencimientoVO documFVEN = new FechVencimientoVO();
				documFVEN.setObservacion(rs.getString(1)); 	
				//System.out.println("ID Doc Det:"+rs.getString(2));
				listRetorno.add(documFVEN);	

			}
			
			rs.close();
			stmt.close();
		} catch (SQLException ex) {  
			log.error(horaActual+" Error PKG_FAR_FECHA_VENCIMIENTO.setGrabaFechaVenc SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());
		} finally {			
			conn.close();
			conn = null;
		}
		return listRetorno;
	}
	
	
	public  List<FechaVencimientoDTO> getFechaGuia(String idsede) throws SQLException, IOException{

		Connection conn = ConexionPool.getConnectionPool();	

		ArrayList<FechaVencimientoDTO> listRetorno = new ArrayList<FechaVencimientoDTO>();
		try {
			String query = "{ call "+pkgVar+".PKG_FAR_FECHA_VENCIMIENTO.getFechaGuia(?,?) }"; 	       
			CallableStatement  stmt = conn.prepareCall(query);
			stmt.setString(1, idsede);
			stmt.registerOutParameter(2, OracleTypes.CURSOR);
			stmt.execute();
			ResultSet rs = (ResultSet)stmt.getObject(2);
			while (rs.next()) {
				FechaVencimientoDTO vGuia = new FechaVencimientoDTO();
				vGuia.setKdoc(rs.getString(1));
				vGuia.setFven(rs.getString(2));
				vGuia.setCantidad(rs.getString(3));
				vGuia.setDsuc(rs.getString(5));

				listRetorno.add(vGuia);				
			}
			rs.close();
			stmt.close();
		} catch (SQLException ex) {  
			log.error("Error PKG_FAR_FECHA_VENCIMIENTO.getFechaGuia SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());
		} finally {			
			conn.close();
			conn = null;
		}
		return listRetorno;
	}
	
	public  List<FechaVencimientoDTO> getFechaGuiaDet(String iddoc) throws SQLException, IOException{

		Connection conn = ConexionPool.getConnectionPool();	

		ArrayList<FechaVencimientoDTO> listRetorno = new ArrayList<FechaVencimientoDTO>();
		try {
			String query = "{ call "+pkgVar+".PKG_FAR_FECHA_VENCIMIENTO.getFechaGuiaDetalle(?,?) }"; 	       
			CallableStatement  stmt = conn.prepareCall(query);
			stmt.setString(1, iddoc);
			stmt.registerOutParameter(2, OracleTypes.CURSOR);
			stmt.execute();
			ResultSet rs = (ResultSet)stmt.getObject(2);
			while (rs.next()) {
				FechaVencimientoDTO vGuiadet = new FechaVencimientoDTO();
				
				vGuiadet.setKdoc(rs.getString(1));
				vGuiadet.setKinf(rs.getString(2));
				vGuiadet.setPres(rs.getString(3));
				vGuiadet.setDinf(rs.getString(4));
				vGuiadet.setCantidad(rs.getString(5));
				vGuiadet.setFven(rs.getString(6));
				vGuiadet.setSerie(rs.getString(7));
			

				listRetorno.add(vGuiadet);				
			}
			rs.close();
			stmt.close();
		} catch (SQLException ex) {  
			log.error("Error PKG_FAR_FECHA_VENCIMIENTO.getFechaGuiaDetalle SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());
		} finally {			
			conn.close();
			conn = null;
		}
		return listRetorno;
	}
	
	
	public  int setGrabaGuiaFechaVencimiento(String idDocumento, String idSucursal) throws MissingResourceException, IOException, SQLException{
		int retorno=9;	
		Connection conn = ConexionPool.getConnectionPool();
		try {
		
			String query = "{ call "+pkgVar+".PKG_FAR_FECHA_VENCIMIENTO.setGrabaGuiaVencimiento(?,?) }"; 	       
			CallableStatement  stmt = conn.prepareCall(query);			
			stmt.setString(1, idDocumento);		
			stmt.setString(2, idSucursal);	
			stmt.execute();
			stmt.close();
			retorno=1;
		} catch (SQLException ex) {  
			log.error(horaActual+" Error PKG_FAR_FECHA_VENCIMIENTO.setGrabaGuiaVencimiento SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());
		} finally {			
			conn.close();
			conn = null;
		}
		
		
	 return retorno;	
	}
	
	
	public  String  setFechaVencNew(String  Ksuc, String Kinf, String Pres, String Fecha, String Cantidad, String Serie, String Observacion) throws SQLException, IOException{

		Connection conn = ConexionPool.getConnectionPool();	
		String retorno="nada";
		
		try {
			String query = "{ call "+pkgVar+".PKG_FAR_FECHA_VENCIMIENTO.setFechaVencNew(?,?,?,?,?,?,?,?) }";
			//System.out.println("Precio:"+documentoDetVo.getPrecioListaNeto()+"fin");
			CallableStatement  stmt = conn.prepareCall(query);
			stmt.setString(1, Ksuc);
			stmt.setString(2, Kinf);
			stmt.setString(3, Pres);
			stmt.setString(4, Fecha);		
			stmt.setString(5, Cantidad);
			stmt.setString(6, Serie);
			stmt.setString(7, Observacion);
			stmt.registerOutParameter(8, OracleTypes.VARCHAR);
			stmt.execute();
			retorno = stmt.getString(8);

			stmt.close();
		} catch (SQLException ex) {  
			log.error(horaActual+" Error PKG_FAR_FECHA_VENCIMIENTO.setFechaVencNew SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());
		} finally {			
			conn.close();
			conn = null;
		}
		return retorno;
	}
	

}
